package com.cykj.order.mapper;

import com.cykj.order.domain.CtCart;
import com.cykj.order.domain.CtItem;
import com.cykj.order.domain.vo.CartInfoVo;
import com.cykj.order.domain.vo.CartItemVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 购物车Mapper接口
 * 
 * @author cykj
 * @date 2025-01-20
 */
@Mapper
public interface CartMapper {
    
    /**
     * 根据用户ID和店铺ID查询购物车
     * 
     * @param customerId 用户ID
     * @param businessId 店铺IDz`
     * @return 购物车信息
     */
    CtCart selectCartByCustomerAndBusiness(@Param("customerId") Integer customerId, 
                                          @Param("businessId") Integer businessId);
    
    /**
     * 根据购物车ID查询购物车
     * 
     * @param cartId 购物车ID
     * @return 购物车信息
     */
    CtCart selectCartByCartId(@Param("cartId") Integer cartId);
    
    /**
     * 插入购物车
     * 
     * @param cart 购物车信息
     * @return 影响行数
     */
    int insertCart(CtCart cart);
    
    /**
     * 根据购物车ID查询购物车商品明细
     * 
     * @param cartId 购物车ID
     * @return 购物车商品明细列表
     */
    List<CartItemVo> selectCartItemsByCartId(@Param("cartId") Integer cartId);
    
    /**
     * 根据用户ID和店铺ID查询购物车详细信息（包含商品明细）
     * 
     * @param customerId 用户ID
     * @param businessId 店铺ID
     * @return 购物车详细信息
     */
    CartInfoVo selectCartInfoByCustomerAndBusiness(@Param("customerId") Integer customerId, 
                                                  @Param("businessId") Integer businessId);
    
    /**
     * 根据购物车ID和商品ID查询购物车商品是否存在
     * 
     * @param cartId 购物车ID
     * @param productId 商品ID
     * @return 购物车商品信息，如果不存在返回null
     */
    CtItem selectCartItemByCartIdAndProductId(@Param("cartId") Integer cartId, 
                                             @Param("productId") Integer productId);
    
    /**
     * 插入购物车商品
     * 
     * @param cartItem 购物车商品信息
     * @return 影响行数
     */
    int insertCartItem(CtItem cartItem);
    
    /**
     * 更新购物车商品数量
     * 
     * @param cartItem 购物车商品信息
     * @return 影响行数
     */
    int updateCartItemNumber(CtItem cartItem);
    
    /**
     * 删除购物车商品
     * 
     * @param cartId 购物车ID
     * @param productId 商品ID
     * @return 影响行数
     */
    int deleteCartItem(@Param("cartId") Integer cartId, @Param("productId") Integer productId);
    
    /**
     * 根据商品ID查询商品价格
     * 
     * @param productId 商品ID
     * @return 商品价格
     */
    BigDecimal selectProductPriceByProductId(@Param("productId") Integer productId);
    
    /**
     * 清空购物车（删除购物车中的所有商品）
     * 
     * @param cartId 购物车ID
     * @return 影响行数
     */
    int clearCartItems(@Param("cartId") Integer cartId);


    /**
     * 根据用户ID查询所有购物车（按商家分组）
     *
     * @param customerId 用户ID
     * @return 购物车列表
     */
    List<CtCart> selectAllCartsByCustomerId(@Param("customerId") Integer customerId);
}
